package cn.lijiguo.logs.jul;

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.*;

/**
 * 测试 java.util.logging 包下的日志
 * @author lijiguo
 */
public class JulTest {

    // 获取日志记录器
    private Logger logger = Logger.getLogger(JulTest.class.getName());

    /**
     * 测试快速入门
     */
    @Test
    public void testQuick() {
        // 获取日志记录器
        Logger logger = Logger.getLogger("cn.chinaunicom.logs.jul.JulTest");
        // 输出日志信息
        logger.info("日志信息");

        // 使用通用方法输出日志信息
        logger.log(Level.WARNING, "这里是警告信息, {0} - {1}", new Object[] { 1001 ,"Hello World" });
    }

    /**
     * 测试日志级别
     */
    @Test
    public void testLogLevel() {
        // 获取日志记录器 在类中统一定义
        // Logger logger = Logger.getLogger(JulTest.class.getName());

        // 输出日志信息 级别由高到低
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info"); // JVM 默认的日志级别是 info
        logger.config("config");
        logger.fine("fine"); // 一般使用 fine 级别对 debug 日志输出
        logger.finer("finner");
        logger.finest("finest");
    }

    /**
     * 自定义日志级别
     */
    @Test
    public void testLogConfig() throws IOException {
        // 自定义日志级别 修改日志级别为 fine
        // 单独设置 不起作用
        // logger.setLevel(Level.FINE);

        // 在设置日志级别之前，首先把默认级别关闭
        logger.setUseParentHandlers(Boolean.FALSE);

        // 创建 ConsoleHandler 控制台输出
        ConsoleHandler consoleHandler = new ConsoleHandler();
        // 创建简单格式转换对象
        SimpleFormatter simpleFormatter = new SimpleFormatter();
        // 进行关联
        consoleHandler.setFormatter(simpleFormatter);
        logger.addHandler(consoleHandler);

        // 设置将日志输出到文件 FileHandler
        FileHandler fileHandler = new FileHandler("logs/jul.log");
        // 进行关联
        fileHandler.setFormatter(simpleFormatter);
        logger.addHandler(fileHandler);

        // 设置日志级别
        // 修改为 fine
        logger.setLevel(Level.FINE);
        consoleHandler.setLevel(Level.FINE);

        // 输出日志信息 级别由高到低
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info"); // JVM 默认的日志级别是 info
        logger.config("config");
        logger.fine("fine"); // 一般使用 fine 级别对 debug 日志输出
        logger.finer("finner");
        logger.finest("finest");
    }

    /**
     * Logger 对象父子关系
     */
    @Test
    public void testLogParent() {
        Logger logger1 = Logger.getLogger("cn.chinaunicom");
        Logger logger2 = Logger.getLogger("cn.chinaunicom.logs.juc");

        // logger2 的父对象是 logger1
        System.out.println(logger2.getParent() == logger1);

        // 所有日志记录器的顶级父元素 java.util.logging.LogManager$RootLogger@48533e64, name: ""
        System.out.println("logger1 Parent:" + logger1.getParent() + ", name: " + logger1.getParent().getName());
    }

    /**
     * 测试加载自定义配置文件
     */
    @Test
    public void testLogProperties() throws IOException {
        // 读取配置文件，通过类加载器
        InputStream resource = JulTest.class.getClassLoader().getResourceAsStream("logging.properties");

        // 创建 LogManager 对象
        LogManager logManager = LogManager.getLogManager();

        // 通过 LoggerManager 对象加载配置文件
        logManager.readConfiguration(resource);

        // 创建 Logger 对象
        Logger logger = Logger.getLogger(JulTest.class.getName());

        // 输出日志信息 级别由高到低
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info"); // JVM 默认的日志级别是 info
        logger.config("config");
        logger.fine("fine"); // 一般使用 fine 级别对 debug 日志输出
        logger.finer("finner");
        logger.finest("finest");
    }
}
